package com.ry.demo.concurrent.demo;

import java.util.LinkedList;
import java.util.Objects;

/**
 * @Author: lihui
 * @Date: 2021-12-04 18:59
 * @Description:
 */
public class MyQueue {

    private static final int MAX_SIZE = 2;

    private LinkedList<String> queue = new LinkedList<>();

    public synchronized void offer(String element){
        try {

            // 一个线程只要执行到这一步，已经获取到一把锁了
            if (queue.size() == MAX_SIZE){

                // 就是让线程进入一个等待的状态，同时还会释放到锁
                // [这里锁的是MyQueue实例对象，如果不释放锁，那么pop()方法根本没法执行]
                wait();
            }
            queue.addLast(element);

            notifyAll();

        } catch (Exception e){
            e.printStackTrace();
        }
    }

    public synchronized String pop(){
        // 别的线程就可以在这里从队列里take数据
        String element = null;
        try {
            if (queue.size() == 0){
                // 当前队列中没有元素，此时也需要进行等待
                wait();
            }

            element =  queue.removeFirst();

            // 唤醒当前正在等待这个锁的那些线程
            notifyAll();

            System.out.println("pop()");
        } catch (Exception e){
            e.printStackTrace();
        }

        return element;
    }


    public static void main(String[] args) {

        MyQueue myQueue = new MyQueue();

    }

}
